home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 314.adf / Zc / zcsrc.lzh / IOLib / stdio / fdopen.c < prev    next >
C/C++ Source or Header  |  1989-05-30  |  1KB  |  69 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3.  
  4. extern    FILE    _iob[];
  5.  
  6. FILE *fdopen(h, mode)
  7. register int h;
  8. register char *mode;
  9. {
  10.     register char *p = NULL;
  11.     register int i, iomode = 0, f = 0;
  12.     register FILE *fp = NULL;
  13.     long temp = 0;
  14.  
  15.     for(i=0; (!fp && (i < _NFILE)); ++i)
  16.         if(!(_iob[i]._flag & (_IOREAD | _IOWRT)))   /* empty slot? */
  17.             fp = &_iob[i];
  18.     if(!fp)
  19.         return(NULL);
  20.     while(*mode)
  21.         {
  22.         switch(*mode++)
  23.             {
  24.             case 'r':
  25.                 f |= _IOREAD;
  26.                 break;
  27.             case 'w':
  28.                 f |= _IOWRT;
  29.                 iomode |= (O_CREAT | O_TRUNC);
  30.                 break;
  31.             case 'a':
  32.                 f |= _IOWRT;
  33.                 iomode |= (O_CREAT | O_APPEND);
  34.                 break;
  35.             case '+':
  36.                 f |= (_IOREAD | _IOWRT);
  37.                 break;
  38.             case 'b':
  39.                 f |= _IOBIN;
  40.                 break;
  41.             case 't':
  42.                 f &= ~_IOBIN;
  43.                 break;
  44.             default:
  45.                 fputs(stderr, "Illegal file mode.\n");
  46.                 return(NULL);
  47.             }
  48.         }
  49.     if((i = (f & (_IOREAD | _IOWRT))) == 0)
  50.         return(NULL);
  51.     else if(i == _IOREAD)
  52.         iomode |= O_RDONLY;
  53.     else if(i == _IOWRT)
  54.         iomode |= O_WRONLY;
  55.     else
  56.         iomode |= O_RDWR;
  57.     if(isatty(h))
  58.         f |= (_IODEV | _IOFBF);
  59.     else
  60.         f |= _IOFBF;
  61.     fp->_file = h;            /* file handle */
  62.     fp->_flag = f;            /* file status flags */
  63.     fp->_base = NULL;        /* base of file buffer */
  64.     fp->_ptr = NULL;        /* current buffer pointer */
  65.     fp->_bsiz = 0;            /* buffer size */
  66.     fp->_cnt = 0;            /* # of bytes in buffer */
  67.     return(fp);
  68. }
  69.